---
id: dbcontext-sql-template
title: 9.16 Sql 模板
sidebar_label: 9.16 Sql 模板
---

## 9.16.1 `Sql` 模板

通常我们程序中执行数据库的 `sql` 语句都写在了程序集中，随程序一起编译，后续需要修改，则重新编译代码。

所以，`Furion` 创造出一种 `Sql` 模板的方式，程序执行 `Sql` 时，只需要使用特殊标记即可：`#(模板Key)`，这些真实的 `Sql` 配置在 `.json` 或 `.xml` 配置文件中。

如：

- **Json** 方式

```json
{
  "Select.User": "select * from User where id > @id"
}
```

- **Xml** 方式

```xml
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <Select.User>select * from User where id > @id</Select.User>
</configuration>
```

## 9.16.2 `Sql` 模板优缺点

### 9.16.2.1 优点

- 支持 `Sql` 动态配置，可在程序运行时动态调配 `Sql` 语句
- 支持程序 `Sql` 语句加密

### 9.16.2.2 缺点

- 需增加对应配置文件
- 不容易调试 `Sql` 代码

## 9.16.3 如何使用

在执行 `Sql` 的时候，只需要填写指定模板即可。

### 9.16.3.1 常规使用

```cs
// 仓储方式
var users = repository.SqlQuery<User>("#(Select.User)", new { id = 1});

// 懒人方式
var users = "#(Select.User)".SqlQuery<User>(new { id = 1});

// Sql 代理方式
[SqlExecute("#(Select.User)")]
List<User> GetUser(int id);
```

### 9.16.3.2 高级嵌套

```cs
var users = repository.SqlQuery<User>(
@"select * from user u
left join #(User.Detail) d on u.Id = d.UserId
where id > @id");
```

## 9.16.4 `Sql` 模板配置

### 9.16.4.1 普通模式

```json
{
  "Select.User": "select * from User"
}
```

### 9.16.4.2 更多配置

:::warning 功能移除声明

以下内容在 `Furion 2.13 +` 版本中已移除。

:::

```json
{
  "Select.User": {
    "Sql": "select * from User where id > @id and Name = @name",
    "Params": [
      {
        "Name": " Id",
        "Value": "1",
        "DbType": "Int16",
        "Size": 10
      },
      {
        "Name": " Name",
        "Value": "百小僧",
        "DbType": "String",
        "Size": 10
      }
    ]
  }
}
```

## 9.16.5 反馈与建议

:::note 与我们交流

给 Furion 提 [Issue](https://gitee.com/dotnetchina/Furion/issues/new?issue)。

:::
